perm filename CORSER.SAI[PIC,HE] blob
sn#424537 filedate 1979-03-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00008 ENDMK
C⊗;
COMMENT
THIS IS CORSER.SAI[A700LE03].
L. ERMAN 1-4-71
L.ERMAN 13-FEB-72: ADDED CHECKING IN RELCORE FOR BAD ADDRESS.
L ERMAN 10-APR-72: BLIT,SMEAR,AND GETZCORE ADDED.
;
IFC NOT DECLARATION(CORSERSW!)
THENC
DEFINE CORSERSW! "[]"=[];
IFC NOT DECLARATION(BAYSAISW!)
THENC
ENTRY GETCORE,RELCORE,BLIT,SMEAR,GETZCORE,COREHANDLE,BUFSIZ,BUFVAL,BUFPUT;
BEGIN "CORSER"
REQUIRE "BAYSAI.SAI" SOURCE!FILE;
LET CORSER!TERNAL=INTERNAL;
DEFINE CORSERBLOC!=TRUE;
ELSEC
LET CORSER!TERNAL=EXTERNAL;
DEFINE CORSERBLOC!=FALSE;
IFCR HISEGGING>0 THENC
ELSEC IFCR HISEGGING<0 THENC ENDC ENDC;
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE COREHANDLE(INTEGER GET,ARG,FLAG); ! COREHANDLE;
IFC CORSERBLOC! THENC
BEGIN "COREHANDLE"
INTEGER ANSW;
EXTERNAL INTEGER CORGET,CORREL,GOGTAB;
DEFINE THIS=2, SIZ=3, P='17,
USER='15, XX=4, YY=5;
SIMPLE PROCEDURE BADREL;
USERERR(0,1,"COREHANDLE: RETURNING BAD BLOCK. ADDR="&CVOS(ANSW));
IF GET
THEN BEGIN "GETIT"
START!CODE
MOVE USER,GOGTAB; ! FOR SAFETY;
MOVE SIZ,ARG;
PUSHJ P,CORGET;
SETZM THIS; ! CAN'T GET IT;
MOVEM THIS,ANSW;
END;
IF ANSW=0 AND FLAG THEN
USERERR(0,1,"CORSER: CAN'T GET "&CVS(ARG)&" WORDS OF CORE.");
RETURN(ANSW);
END "GETIT"
ELSE START!CODE "GIVIT"
MOVE USER,GOGTAB;
MOVE THIS,ARG;
! LET'S FIRST DO SOME ERROR CHECKING;
MOVEM THIS,ANSW; ! FOR ERROR MESSAGE;
MOVN XX,-1(THIS); ! BLOCK SIZE;
SKIPG XX; ! BETTER BE >0;
PUSHJ P,BADREL; ! NO!;
ADDI XX,-3(THIS); ! ADDR OF END OF BLOCK;
MOVEI YY,-2(THIS); ! ADDR OF HEAD;
TLO YY,'400000; ! USE BIT;
CAME YY,(XX); ! MATCH?;
PUSHJ P,BADREL; ! NO!;
! NOW GIVE UP THE BLOCK;
PUSHJ P,CORREL;
END "GIVIT";
END "COREHANDLE";
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE GETCORE(INTEGER AMT); ! GETCORE;
IFC CORSERBLOC! THENC
COREHANDLE(TRUE,AMT,TRUE);
ENDC
CORSER!TERNAL SIMPLE PROCEDURE RELCORE(INTEGER WHR); ! RELCORE;
IFC CORSERBLOC! THENC
COREHANDLE(FALSE,WHR,TRUE);
ENDC
CORSER!TERNAL SIMPLE PROCEDURE BLIT(INTEGER TOO,FROM,LENG); ! BLIT;
IFC CORSERBLOC! THENC
IF LENG>0 THEN
START!CODE "BLIT" ! THIS DOES A BLT;
HRLZ 1,FROM;
HRR 1,TOO;
HRRZ 2,TOO;
ADD 2,LENG;
SUBI 2,1;
BLT 1,@ 2;
END "BLIT";
ENDC
CORSER!TERNAL SIMPLE PROCEDURE SMEAR(INTEGER STRT,LENG,VAL); ! SMEAR;
IFC CORSERBLOC! THENC
IF LENG>0 THEN BEGIN "SMEAR"
! THIS SMEARS VAL OVER LENG LOCATIONS, STARTING AT STRT (WHICH IS
AN INT VRBL THAT CONTAINS THE DESIRED ADDRESS);
START!CODE MOVE 0,VAL; MOVEM 0,@ STRT; END;
BLIT(STRT+1,STRT,LENG-1);
END "SMEAR";
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE GETZCORE(INTEGER AMT); ! GETZCORE;
IFC CORSERBLOC! THENC
BEGIN "GETZCORE" INTEGER WHR;
WHR←GETCORE(AMT);
IF WHR≠0 THEN SMEAR(WHR,AMT,0);
RETURN(WHR);
END "GETZCORE";
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFSIZ(INTEGER ADDRES);
IFC CORSERBLOC! THENC
START!CODE
MOVE 1,ADDRES;
MOVN 1,-1(1);
END;
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFVAL(INTEGER ADDRES);
IFC CORSERBLOC! THENC
START!CODE
MOVE 1,ADDRES;
MOVE 1,(1)
END;
ENDC
CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFPUT(INTEGER ADDRES,VAL);
IFC CORSERBLOC! THENC
START!CODE
MOVE 1,VAL;
MOVE 2,ADDRES;
MOVEM 1,(2)
END;
ENDC
IFC CORSERBLOC! THENC
END "CORSER"
ENDC
ENDC
! END OF CORSER.SAI[A700LE03];